<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>MyBatis  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="" />

<meta name="keywords" content="one, two, ">


<meta property="og:title" content="MyBatis  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/framework/mybatis/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content=""/>
<meta property="og:article:published_time" content="2017-12-14T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-12-14T00:00:00Z" />

  
    
<meta property="og:article:tag" content="one">
    
<meta property="og:article:tag" content="two">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "MyBatis",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-12-14",
    "description": "",
    "wordCount":  350 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/framework/mybatis/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>MyBatis
</h1>

</header>

  <div class="container content">
  <h3 id="heading"></h3>
<p>#：是占位符，可以防止sql注入<br>
$：直接追加在sql中，一般会有sql注入问题</p>
<h3 id="mybatis-">MyBatis 延迟加载，一级缓存，二级缓存设置</h3>
<p><a href="http://www.cnblogs.com/QQParadise/articles/5109633.html">http://www.cnblogs.com/QQParadise/articles/5109633.html</a>
未完待续</p>
<h6 id="heading1">什么是延迟加载</h6>
<pre><code>    resultMap中的association和collection标签具有延迟加载的功能。  
    延迟加载的意思是说，在关联查询时，利用延迟加载，先加载主信息。使用关联信息时再去加载关联信息。
</code></pre>
<h6 id="heading2">设置延迟加载</h6>
<pre><code>    需要在SqlMapConfig.xml文件中，在&lt;settings&gt;标签中设置下延迟加载。
    lazyLoadingEnabled、aggressiveLazyLoading
</code></pre>
<pre><code>&lt;!-- 开启延迟加载 --&gt;
    &lt;settings&gt;
        &lt;!-- lazyLoadingEnabled:延迟加载启动，默认是false --&gt;
        &lt;setting name=&quot;lazyLoadingEnabled&quot; value=&quot;true&quot;/&gt;
        &lt;!-- aggressiveLazyLoading：积极的懒加载，false的话按需加载，默认是true --&gt;
        &lt;setting name=&quot;aggressiveLazyLoading&quot; value=&quot;false&quot;/&gt;
         
        &lt;!-- 开启二级缓存，默认是false --&gt;
        &lt;setting name=&quot;cacheEnabled&quot; value=&quot;true&quot;/&gt;
    &lt;/settings&gt;
</code></pre><h4 id="heading3">什么是查询缓存</h4>
<p>Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。<br>
在同一个SqlSession中，执行相同的查询SQL，第一次会去查询数据库，并写到缓存中；第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作，则SqlSession的缓存清空。</p>
<p>Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容，多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
在同一个namespace下的mapper文件中，执行相同的查询SQL，第一次会去查询数据库，并写到缓存中；第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作，则二级缓存清空。</p>
<p>一级缓存区域是根据SqlSession为单位划分的。</p>
<p>每次查询会先去缓存中找，如果找不到，再去数据库查询，然后把结果写到缓存中。Mybatis的内部缓存使用一个HashMap，key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。
SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。</p>
<p>二级缓存是mapper级别的。Mybatis默认是没有开启二级缓存。</p>
<p>第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。</p>
<p>第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。</p>
<p>如果调用相同namespace下的mapper映射文件中的增删改SQL，并执行了commit操作。此时会清空该namespace下的二级缓存。</p>
<p>开启二级缓存</p>
<p>1、  在核心配置文件SqlMapConfig.xml中加入以下内容（开启二级缓存总开关）：
cacheEnabled设置为 true</p>
<p>2、在映射文件中，加入以下内容，开启二级缓存：</p>
<h6 id="heading4">实现序列化</h6>
<p>由于二级缓存的数据不一定都是存储到内存中，它的存储介质多种多样，所以需要给缓存的对象执行序列化。</p>
<p>如果该类存在父类，那么父类也要实现序列化。</p>
<p>禁用二级缓存</p>
<p>该statement中设置userCache=false可以禁用当前select语句的二级缓存，即每次查询都是去数据库中查询，默认情况下是true，即该statement使用二级缓存。</p>
<p>刷新二级缓存</p>
<h3 id="log4jmybatis">配置Log4j以便查看MyBatis操作数据库过程</h3>
<p>在src/main/resources 添加log4j.properties 配置文件</p>
<pre><code class="language-properties" data-lang="properties">#全局配置
log4j.rootLogge=Error,stdout
#Mybatis 日志配置
log4j.logger.tk.mybatis.simple.mapper=TRACE
#控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
</code></pre><pre><code>Reader reader=Resources.getR
</code></pre><h5 id="heading5">参数</h5>
<h6 id="heading6">默认参数</h6>
<p>传入产生是Map,默认产生名是_parameter
其他是可用 （0，1）或（param1,param2）
自定义参数
@Param(&ldquo;name&rdquo;)String str</p>
<hr>
<h3 id="mbggenerator">（MBG）Generator</h3>
<p>*****  标签</p>
<ul>
<li>generatorConfiguration 
+  properties (0个或1个)指定一个需要在配置中解析使用的外部属性文件
*  属性只能使用其中一个，同时出现则会报错
-  resource 指定classpath 下的属性文件
-  url 指定文件系统上的特点位置
+  classPathEntry (0个或多个) 指定驱动路径
-  location 指定驱动路径
+  context
*  属性
-  id：(1个)运行MBG时使用
-  defaultModelType：定义MBG如何生成实体类
-  conditional ：如果一个表的主键只有一个字段，那么不会为该字段生成单独的实体，会将该字段合并到基本实体类中。
-  flat ：只为每张表生成一个实体类。这个实体类包含表中所有字段。
-  hierarchical：如果表有主键，该模型会产生一个单独的主键实体。其他字段另外生成一个单独实体
-  targetRuntime：此属性用于指定生成代码的运行时环境
-  MyBatis3：默认值
-  MyBatis3Simple：不会生成与Example相关的方法。
-  introspectedColumnlmpl：指定扩展IntrospectedColumn类的实现类。
*  子标签
-  property：(0个或多个) 分隔符
-  plugin：(0个或多个)定义插件
-  commentGenerator：(0个或1个)生成注释信息，或者实现CommentGenerator 接口自定义注释。
-  jdbcConnection：(1个)指定数据库连接信息
-  javaTypeResolver：(0个或1个)指定JDBC类型和Java类型如何转换，
-  javaModelGenerator：(1个)控制生成的实体类
-  sqlMapGenerator：(0个或1个)配置SQL映射生成器（Mapper.xml）的属性
-  javaClientGenerator：(0个或1个)配置Java客服端生成器（Mapper接口）的属性
-  table：(一个或多个)配置需要通过内省数据库的表
配置时必须按顺序,按列举顺序一致</li>
</ul>
<p>******  context 子标签详解</p>
<ul>
<li>property  分隔符（MySQL  &ldquo;`&rdquo; ,SQL Server[] 将带有空格的当一个整体处理，处理关键字与字段名一样。）
-  autoDelimitKeywords
-  beginningDelimiter
-  endingDelimiter
-  javaFileEncoding 设置要使用的java文件编码
-  javaFormatter 
-  xmlFormatter</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;context</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;MySQL&#34;</span> <span style="color:#a6e22e">targetRuntime=</span><span style="color:#e6db74">&#34;MyBatis3Simple&#34;</span> <span style="color:#a6e22e">defaultModelType=</span><span style="color:#e6db74">&#34;flat&#34;</span><span style="color:#f92672">&gt;</span>
			<span style="color:#f92672">&lt;property</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;autoDelimitKeywords&#34;</span> <span style="color:#a6e22e">value=</span><span style="color:#e6db74">&#34;true&#34;</span><span style="color:#f92672">/&gt;</span>
			<span style="color:#f92672">&lt;property</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;beginningDelimiter&#34;</span> <span style="color:#a6e22e">value=</span><span style="color:#e6db74">&#34;`&#34;</span><span style="color:#f92672">/&gt;</span>
			<span style="color:#f92672">&lt;property</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;endingDelimiter&#34;</span> <span style="color:#a6e22e">value=</span><span style="color:#e6db74">&#34;`&#34;</span><span style="color:#f92672">/&gt;</span>
<span style="color:#f92672">&lt;/context&gt;</span>
</code></pre></div><ul>
<li>plugin 
定义插件，可以配置0个或者多个，个数不受限制。</li>
<li>commentGengeator
配置如何生成注释性信息，最多可以配置一个。
*  属性
-  type 指定用户实现类
*  子标签
-  property
-  suppressAllComments：阻止生成注释，默认为false。
-  suppressDate：阻止生成的注释包含时间戳，默认为false。
-  addRemarkComments：注释是否添加数据库表备注信息，默认为false。</li>
<li>jdbcConnection
如果JDBC 驱动不在classPath下，就要通过classPathEntry标签引入jar包，推荐将jar包放到classPath下
*  必选属性
-  driverClass：访问数据库的JDBC驱动程序的完全限定名
-  connectionURL：访问数据库的JDBC连接URL
*  可选属性
-  userId：访问数据库的用户ID。
-  password：访问数据库的密码。
-  property：可以设置多个，
Oracle 通过特殊配置（property ）使JDBC 方式能够获取到列的注释信息。配置如下
<!-- raw HTML omitted --></li>
<li>javaTypeResolver		指定JDBC类型和Java类型如何转换，
-  property  forceBigDecimals 控制是否强制将DECIMAL和
NUMERIC类型的JDBC 字段转换成JAVA类型的
java.math.BigDecimal,默认值为false,一般不配置。</li>
<li>javaModelGenerator：控制生成的实体类
*  必选属性
-  targetPackage：生成实体类存放的包名
-  targenProject：指定目标项目路径，可以使用相对路径和绝对路径
*  子标签property属性
-  constructorBased
-  enableSubPackages
-  immutable
-  rootClass
-  trimStrings</li>
<li>sqlMapGenerator：配置SQL映射生成器（Mapper.xml）的属性
可选标签，如果指定了一个sqlMapGenerator，MBG只生成XML的SQL映射文件和实体类。
没有指定，MBG只生成实体类。
*  必选属性
-  targetPackage：生成SQL映射文件（XML）存放的包名。
-  targetProject：指定目标项目路径，可以使用相对路径或绝对路径
*  标签
-  property：
-  enableSubPackages  为true MBG 会根据catalog 和 schema 来生成子包。
如果为false就会直接用targetPackage属性，默认为false</li>
<li>javaClientGenerator：配置Java客服端生成器（Mapper接口）的属性
*  必选属性
-  type：选择客户端代码生成器，自定义实现需继承AbstractJavaClientGenerator类</li>
<li>table：配置需要通过内省数据库的表
*  必选属性
*  标签
-  tableName指定要生成的表名
-  schema  数据库的schema
-  catalog<br>
-  alias
-  domainObjectName
-  selectByPrimaryKeyQueryId：DBA跟踪工具中会用到
-  selectByExampleQueryId
-  modelType
-  escapeWildcards
-  delimitldentifiers
-  delimitAllColumns
-  constructorBased
-  ignoreQualifiersAtRuntime
-  immutable
-  modelOnly
-  rootClass
-  rootInterface
-  runtimeCatalog
-  runtimeSchema
-  runtimeTableName
-  selectAllOrderByClause
-  useActualColumnNames
-  useColumnlndexes
-  useCompoundPropertyNames
-  property
-  generatedKey(0个或1个)
-  columnRenamingRule(0个或1个)
-  columnOverride(0个或多个)
-  ignoreColumn(0个或多个)</li>
</ul>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

